import pandas as pd
from typing import Tuple

# context = {'own': False, 'price': 0, 'time': None}


def _upCross() -> bool:
    """上穿判断"""


def _downBelow() -> bool:
    """跌破判断"""


def init_context_rule():
    global context
    context = {'own': False, 'price': 0, 'time': None}


def _evaluateRR(rr=float(0)) -> str:
    """根据盈利率评估交易
    亏损 - 盈利 + 盈利大于10%，*   盈利大于5%，# 盈利大于3%，$
    """
    if rr < 0:
        return '-'
    elif rr < 0.03:
        return '+'
    elif rr < 0.05:
        return '$'
    elif rr < 0.1:
        return '#'
    else:
        return '*'


def rule_1(i=0, r=pd.DataFrame(), o=pd.DataFrame(), ma_in=5, ma_out=5) -> Tuple[int, pd.DataFrame]:
    """规则函数（执行在每一条记录）
    规则：
    上一个价格小于ma_in，当前价格大于ma_in，买入。
    当前价格小于ma_out，或者小于ma_in，卖出。

    参数：i-当前处理的数据序号，r-数据集，o-执行结果，ma-MA值，stock-当前持有股票（own-是否持有，price-当前持有价格, time-买入时间）
    records格式：price, time
    output格式：time_in, price_in, time_out, price_out, ratio_of_return, evaluate

    返回：是否成功卖出，1：以高于买入价卖出，0：未卖出，-1：以低于买入价卖出
    """

    if i < ma_out or i < ma_in+1:  # 当前规则执行前提条件不满足
        return 0, o

    global context

    ma_out_cur = r['price'][i-ma_out:i].mean()
    ma_in_pre = r['price'][i-ma_in-1:i-1].mean()
    ma_in_cur = r['price'][i-ma_in:i].mean()

    price_pre = r.at[i-1, 'price']
    price = r.at[i, 'price']
    time = r.at[i, 'time']
    if context['own'] and (price < ma_out_cur or price < ma_in_cur):  # 卖出
        context['own'] = False
        rr = price/context['price']-1.0
        o = o.append(pd.DataFrame([[context['time'], context['price'], time, price, round(rr, 4), _evaluateRR(rr)]], columns=[
            'time_in', 'price_in', 'time_out', 'price_out', 'rate_of_return', 'evaluate']), ignore_index=True)
        if price > context['price']:
            return 1, o
        else:
            return -1, o
    elif not context['own'] and price_pre < ma_in_pre and price > ma_in_cur:  # 买入
        context['own'] = True
        context['price'] = price
        context['time'] = time

    return 0, o
